package com.ck.ips.dao.sys;

import com.ck.common.model.User;
import com.ck.ips.core.listener.event.LoginSuccessEvent;
import com.ck.ips.model.vo.sys.UserListVO;
import com.ck.ips.model.vo.sys.UserRoleListVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {

	/**
	 * 通过用户名获取用户
	 *
	 * @param userName 用户名
	 * @return User(用户)
	 */
	User getUserByUserName(@Param("userName") String userName);

	/**
	 * 通过id获取用户
	 *
	 * @param userId
	 * @return User(用户)
	 */
	User getUserById(Long userId);

	/**
	 * 保存用户
	 *
	 * @param user User
	 */
	void insertUser(User user);

	/**
	 * 保存用户角色关系
	 *
	 * @param userId 用户ID
	 */
	void insertUserRole(@Param("userId") Long userId, @Param("roleIdArray") String[] roleIdArray);

	/**
	 * 保存用户部门关系
	 *
	 * @param userId       用户ID
	 * @param departmentId 部门ID
	 */
	void insertUserDepartment(@Param("userId") Long userId, @Param("departmentId") Long departmentId);

	/**
	 * 修改用户
	 *
	 * @param user User
	 */
	void updateUserById(User user);

	/**
	 * 获取用戶列表
	 *
	 * @param status   状态
	 * @param userName 用户名
	 * @return PageInfo<UserListVO>
	 */
	Page<UserListVO> listUser(@Param("status") Integer status, @Param("userName") String userName,
							  @Param("realName") String realName, @Param("mobile") String mobile,
							  @Param("departmentId") Long departmentId, @Param("roleName") String roleName);

	/**
	 * 获取用户所属角色列表
	 *
	 * @param userId 用户ID
	 * @return List<String>（角色名列表）
	 */
	List<UserRoleListVO> listUserRoleName(Long userId);

	/**
	 * 通过用户ID删除用户角色关系
	 *
	 * @param userId 用户ID
	 */
	void deleteUserRoleByUserId(Long userId);

	/**
	 * 通过用户ID删除用户部门关系
	 *
	 * @param userId 用户ID
	 */
	void deleteUserDepartmentByUserId(Long userId);

	/**
	 * 保存用户登录成功记录
	 *
	 * @param loginSuccessEvent
	 * @return
	 */
	int saveLoginSuccessRecord(LoginSuccessEvent loginSuccessEvent);

	/**
	 * 删除用户
	 *
	 * @param userId
	 */
	void deleteUser(@Param("userId") Long userId);

	/**
	 * 根据用户id获取对应的角色id
	 *
	 * @param userId
	 * @return
	 */
	List<Long> getRoleByUserId(@Param("userId") Long userId);
}